package com.air.controller.airline;


import com.air.dto.FlightDTO;
import com.air.dto.FlightPageQueryDTO;
import com.air.entity.Flight;
import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.FlightService;
import com.air.vo.FlightVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 航班控制器，负责处理与航班相关的HTTP请求。
 * <p>
 * 该控制器使用@RestController注解，表明它是一个REST API控制器，负责处理来自客户端的HTTP请求。
 * @RequestMapping注解指定了这个控制器处理的请求URL的基本路径为/airline/flight。
 * 使用@Slf4j注解引入日志门面，便于在类中进行日志记录。
 * @Api注解用于Javadoc，标明这个类是一个API，属于"航班相关接口"这一标签。
 */
@RestController
@RequestMapping("/airline/flight")
@Slf4j
@Api(tags = "航班相关接口")
public class FlightController {

    @Autowired
    private FlightService flightService; //自动注入航班服务


    /**
     * 添加航班信息。
     * <p>
     * 通过POST请求接收FlightDTO对象，其中包含了待添加的航班的详细信息。
     * 调用flightService的save方法保存航班信息。
     * 返回操作结果，如果操作成功，则返回一个表示成功的Result对象。
     *
     * @param flightDTO 包含新增航班信息的数据传输对象。
     * @return 表示操作结果的Result对象。
     */
    @PostMapping
    @ApiOperation("添加航班")
    public Result save(@RequestBody FlightDTO flightDTO){
        // 记录添加航班的信息，包括航班数据对象的详细信息
        log.info("添加航班:{}",flightDTO);
        // 调用flightService的save方法，保存传入的航班数据对象
        flightService.save(flightDTO);
        // 返回操作成功的结果反馈
        return Result.success();

    }

    /**
     * 分页查询航班信息接口。
     * 通过接收FlightPageQueryDTO对象作为参数，实现根据特定条件对航班信息进行分页查询。
     * 返回查询结果的分页信息。
     *
     * @param flightPageQueryDTO 包含分页查询条件的DTO（数据传输对象）。
     * @return 返回一个Result对象，其中包含查询结果的分页信息。
     */
    /**
     * 分页查询航班
     * @param flightPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("分页查询航班")
    public Result<PageResult> pageQuery(FlightPageQueryDTO flightPageQueryDTO){
        // 记录查询操作的日志信息。
        log.info("分页查询航班:{}",flightPageQueryDTO);
        // 调用flightService的pageQuery方法进行分页查询，并返回查询结果。
        PageResult pageResult = flightService.pageQuery(flightPageQueryDTO);
        // 将查询结果包装在Result对象中返回。
        return Result.success(pageResult);
    }


    /**
     * 批量删除航班记录。
     * 该接口通过接收一个航班ID列表，调用flightService的deleteBatch方法来实现批量删除。
     * 删除操作完成后，返回一个表示操作成功的Result对象。
     *
     * @param ids 航班ID列表，用于指定需要删除的航班记录。
     * @return 返回一个Result对象，表示删除操作的结果。如果删除成功，Result对象中的success方法将返回true。
     */
    @DeleteMapping
    @ApiOperation("批量删除航班")
    public Result delete(@RequestParam List<Long> ids){
        // 记录删除操作的航班ID列表，用于日志记录和问题追踪。
        log.info("删除航班:{}", ids);
        // 调用flightService的deleteBatch方法，传入航班ID列表，执行批量删除操作。
        flightService.deleteBatch(ids);
        // 返回一个表示操作成功的Result对象。
        return Result.success();
    }


    /**
     * 根据指定的ID获取航班信息。
     *
     * 该方法通过GET请求访问，路径参数{id}指定要查询的航班ID。它使用了Swagger的@ApiOperation注解来描述该接口的功能。
     * 主要用于前端或客户端通过航班ID获取详细的航班信息。
     *
     * @param id 航班的唯一标识符。
     * @return 包含查询结果的Result对象，其中data字段是FlightVO类型的航班信息。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询航班")
    public Result<FlightVO> getById(@PathVariable Long id){
        // 记录查询操作的日志，包括查询的航班ID。
        log.info("查询航班:{}", id);
        // 调用flightService的getById方法查询航班信息，并将结果返回。
        FlightVO flightVO = flightService.getById(id);
        return Result.success(flightVO);
    }

    /**
     * 修改航班信息
     *
     * 该方法通过PUT请求对航班信息进行更新。接收一个FlightDTO对象作为请求体，
     * 其中包含了需要更新的航班的所有相关信息。调用flightService的update方法来实际执行更新操作。
     *
     * @param flightDTO 包含待更新航班信息的数据传输对象
     * @return 返回一个Result对象，表示操作的结果。如果操作成功，Result对象将包含成功的标志。
     */
    @PutMapping
    @ApiOperation("修改航班")
    public Result update(@RequestBody FlightDTO flightDTO){
        // 记录修改航班信息的日志
        log.info("修改航班:{}",flightDTO);
        // 调用服务层方法更新航班信息
        flightService.update(flightDTO);
        // 返回操作成功的结果
        return Result.success();
    }


    /**
     * 修改航班状态
     * 该方法通过HTTP POST请求对航班的状态进行更新，支持启动或停止航班。
     * 请求的URL路径中包含状态参数{status}，表示航班的新状态，ID参数{id}表示目标航班的唯一标识。
     *
     * @param status 航班的新状态，通过路径参数传递，表示航班即将启动或停止的状态。
     * @param id 目标航班的唯一标识，通过路径参数传递，用于精确指定要修改的航班。
     * @return 返回一个结果对象，表示操作是否成功。成功时，返回一个空的结果对象。
     */
    @PostMapping("/status/{status}")
    @ApiOperation("修改航班状态")
    public Result startOrStop(@PathVariable Integer status, Long id) {
        // 记录修改航班状态的操作信息，包括新状态和航班ID，用于后续的审计或日志分析。
        log.info("修改航班状态:{},{}", status, id);

        // 调用flightService中的startOrStop方法，实际执行航班状态的修改操作。
        flightService.startOrStop(status, id);

        // 返回一个表示操作成功的结果对象，告知调用方请求已被处理且无错误发生。
        return Result.success();
    }


    /**
     * 根据航空公司的ID查询该航空公司的航班列表。
     *
     * 此方法通过GET请求访问，路径为/list，接收一个Long类型的airlineId参数。
     * 它的目的是为了获取指定航空公司ID下的所有航班信息。
     * @param airlineId 航空公司的ID，用于查询属于该航空公司的航班。
     * @return 返回一个包含航班信息的Result对象。Result对象中封装了一个List<Flight>类型的列表，
     *         列表中包含了属于指定航空公司的所有航班。
     */
    @GetMapping("/list")
    @ApiOperation("根据航空id查询航班")
    public Result<List<Flight>> list(Long airlineId){
        // 调用flightService的服务方法，查询指定航空公司的航班列表
        List<Flight> list = flightService.list(airlineId);
        // 将查询结果封装在Result对象中，以成功状态返回
        return Result.success(list);
    }
}
